// Loesung_von_Aufgabe_2.5.7_6_Kugel

// Kugel in einer zähen Flüssigkeit

float y = 80; // y-Komponente des Kraftvektors F
float i; // Mit i steuern wir die Rotationsgeschwindigkeit um die y-Achse
float t;
PVector r = new PVector(50, 0, 0); // Ortsvektor in cm

void setup() 
{
  /* Mit P3D erzeugt Processing auf dem zweidimensionalen Bildschirm 
   die Illusion eines dreidimensionalen Bildes */
  size(600, 600, P3D);
}

void draw() 
{
  background(180, 180, 0);

  if (y >= -80)
  {
    y = y - 0.04;
  }

  PVector F = new PVector(0, 0, y); // Kraftvektor

  /* Der maximale Betrag von Vektor M in cN beträgt 50 x 80 = 4000 Pixel. Damit er im 
   Fenster dargestellt werden kann, multiplizieren wir ihn mit dem Faktor 0.02. */
  PVector M = F.cross(r).mult(0.02); 

  // Das Koordinatensystem wird in die Fenstermitte verschoben.
  translate(300, 300, 300);

  // Rotation um die y-Achse
  i = i - 0.00025*y;
  rotateY(i);

  // dunkelgraue Kugel
  noStroke();
  fill(150);
  lights();
  sphere(10);

  // rechter Teil der weißen Stange, die an der Kugel befestigt ist
  stroke(255); 
  strokeWeight(5);
  line(0, 0, 0, -r.x, r.y, 0);

  // Faden oberhalb und unterhalb der Kugel
  stroke(0);
  strokeWeight(2);
  line(0, 130, 0, 0, -130, 0);

  // F-Vektor (rot)
  stroke(255, 0, 0); 
  strokeWeight(5);
  line(r.x, r.y, 0, r.x, F.y, F.z);
  strokeWeight(15);
  point(r.x, F.y, F.z);

  // r-Vektor (grün)
  stroke(0, 255, 0); 
  strokeWeight(5);
  line(0, 0, 0, r.x, r.y, 0);
  fill(0, 255, 0);
  strokeWeight(15);
  point(r.x, r.y, 0);

  // M-Vektor (blau)
  stroke(0, 0, 255); 
  strokeWeight(5);
  line(0, 0, 0, M.x, M.y, M.z);
  strokeWeight(15);
  point(M.x, M.y, M.z);

  // Die einzelnen Vektoren werden beschriftet
  fill(0, 0, 255);
  textSize(20);
  text("M", 0, M.y/1.5, M.z-10);
  fill(0, 255, 0);
  text("r", 25, -10);
  fill(255, 0, 0);
  text ("F", r.x, F.y-10, F.z/2);

  t = t + 1/frameRate;
  if (t >= 79.2)
  {
    noLoop();
  }
}